///////////////////////////////////////////////////////////////////////////////
// File:        Sha1.hpp
// Author:      671643387@qq.com
// Description:
///////////////////////////////////////////////////////////////////////////////

#ifndef SHARED_AUTH_SHA1_HPP_
#define SHARED_AUTH_SHA1_HPP_

#if defined(_MSC_VER) && (_MSC_VER >= 1200)
# pragma once
#endif

#include <cstddef>
#include <cstdint>
#include <string>
#include <openssl/sha.h>
#include <openssl/crypto.h>

///////////////////////////////////////////////////////////////////////////////
class BigNumber;

///////////////////////////////////////////////////////////////////////////////
class Sha1Hash
{
public:
    ///////////////////////////////////////////////////////////////////////////
    Sha1Hash(void);
    ~Sha1Hash(void);

public:
    ///////////////////////////////////////////////////////////////////////////
    void Initialize(void);
    void Finalize(void);

    ///////////////////////////////////////////////////////////////////////////
    void UpdateBigNumbers(BigNumber*, ...);
    void UpdateData(const uint8_t*, std::size_t);
    void UpdateData(const std::string&);
    
    ///////////////////////////////////////////////////////////////////////////
    const uint8_t* GetDigest(void) const { return &mDigest[0]; }
    int GetLength(void) const { return SHA_DIGEST_LENGTH; }

private:
    ///////////////////////////////////////////////////////////////////////////
    SHA_CTX     mC_;
    uint8_t     mDigest[SHA_DIGEST_LENGTH];
};

#endif /* SHARED_AUTH_SHA1_HPP_ */
